/******************************************************************************
 ** 文件名称： bsp_key.h
 ** 模块名称： 通用按键模块
 ** 版 本 号： V1.0
 ** 作    者： PLAY
 ** 用    法： 1.修改用于读取引脚状态的宏定义
 **            2.实现Key_GpioInit()函数，用于引脚初始化
 **            3.调用bsp_Key_Init()函数进行初始化，该函数会调用Key_GpioInit()
 **            4.周期性调用Key_Scan()函数进行按键扫描，调用周期建议20ms
 **            5.需要按键时，用Key_GetKeyValue()函数返回键值
 ** 修改记录： 版本     修改人      时间         修改内容
 **
 ******************************************************************************/
#ifndef _KEY_H
#define _KEY_H

/******************************************************************************
 * 头文件
 ******************************************************************************/
#include "main.h"
#include "multi_cyc_fifo.h"
/******************************************************************************
 * 宏定义 ('#define')                             
 ******************************************************************************/
#define KEY_NUM_MAX					6		/*定义按键最大数目，目前没用。程序限定最大支持6*/
#define KEY_LEVEL					0x00	/*定义按键的有效电平。0-低电平有效，1-高电平有效*/

#define KEY_SCAN_TIME				5		/*定义按键扫描的周期（ms）*/

#define KEY_LONG_PERIOD				1000	/*定义按键长按的识别时间。最小1个扫描周期，单位ms*/
#define KEY_CONTINUE_PERIOD			40		/*定义连发键的间隔时间。最小1个扫描周期，单位ms*/
#define KEY_WOBBLE_PERIOD			20		/*消抖期时间，最小1个扫描周期，单位ms*/

/*定义按键键值*/
#define KEY_NULL					0x00
#define KEY_VALUE_1					0x01
#define KEY_VALUE_2					0x02
#define KEY_VALUE_3					0x04
#define KEY_VALUE_4					0x08
#define KEY_VALUE_5					0x10



//定义按键返回值状态(按下,长按,连_发,释放)
#define KEY_PRESS					0x00
#define KEY_LONG					0x80
#define KEY_CONTINUE				0xC0
#define KEY_RELEASE					0x40
#define KEY_CONTINUE_RELEASE		0x20
 
 
 
/*定义读按键引脚状态函数,没用到的写无效电平的值*/
 
#define Read_key_1  HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_5)	/*UP*/
#define Read_key_2	HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_9)  /*加热*/
#define Read_key_3  HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_8)	/*DOWN*/
#define Read_key_4  HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_4)  /*POWER*/
#define Read_key_5	(!KEY_LEVEL)


/*K5按键专用，扫描线。*/
#define Set_key_i_1		//gpio_bits_set(GPIOC,GPIO_PINS_6)
#define Set_key_i_0		//gpio_bits_reset(GPIOC,GPIO_PINS_6)


/*重新定义按键键值及状态*/
#define BUTTON_UP_PRESS			        (KEY_VALUE_1 | KEY_PRESS)
#define BUTTON_UP_RELEASE		        (KEY_VALUE_1 | KEY_RELEASE)
#define BUTTON_UP_LONG			        (KEY_VALUE_1 | KEY_LONG)
#define BUTTON_UP_CONTINUE		        (KEY_VALUE_1 | KEY_CONTINUE)

#define BUTTON_MODE_PRESS		        (KEY_VALUE_2 | KEY_PRESS)
#define BUTTON_MODE_RELEASE		        (KEY_VALUE_2 | KEY_RELEASE)
#define BUTTON_MODE_LONG		        (KEY_VALUE_2 | KEY_LONG)
#define BUTTON_MODE_CONTINUE	        (KEY_VALUE_2 | KEY_CONTINUE)

#define BUTTON_DOWN_PRESS		        (KEY_VALUE_3 | KEY_PRESS)
#define BUTTON_DOWN_RELEASE		        (KEY_VALUE_3 | KEY_RELEASE)
#define BUTTON_DOWN_LONG		        (KEY_VALUE_3 | KEY_LONG)
#define BUTTON_DOWN_CONTINUE	        (KEY_VALUE_3 | KEY_CONTINUE)
#define BUTTON_DOWN_CONTINUE_RELEASE	(KEY_VALUE_3 | KEY_CONTINUE_RELEASE)

#define BUTTON_POWER_PRESS		        (KEY_VALUE_4 | KEY_PRESS)
#define BUTTON_POWER_RELEASE	        (KEY_VALUE_4 | KEY_RELEASE)
#define BUTTON_POWER_LONG		        (KEY_VALUE_4 | KEY_LONG)
#define BUTTON_POWER_CONTINUE	        (KEY_VALUE_4 | KEY_CONTINUE)
#define BUTTON_POWER_CONTINUE_RELEASE	(KEY_VALUE_4 | KEY_CONTINUE_RELEASE)

#define BUTTON_LAMP_PRESS		        (KEY_VALUE_5 | KEY_PRESS)
#define BUTTON_LAMP_RELEASE		        (KEY_VALUE_5 | KEY_RELEASE)
#define BUTTON_LAMP_LONG		        (KEY_VALUE_5 | KEY_LONG)
#define BUTTON_LAMP_CONTINUE	        (KEY_VALUE_5 | KEY_CONTINUE)

#define BUTTON_UP_DOWN_PRESS	        (KEY_VALUE_1 | KEY_VALUE_3 | KEY_PRESS)
#define BUTTON_UP_DOWN_RELEASE	        (KEY_VALUE_1 | KEY_VALUE_3 | KEY_RELEASE)
#define BUTTON_UP_DOWN_LONG		        (KEY_VALUE_1 | KEY_VALUE_3 | KEY_LONG)
#define BUTTON_UP_DOWN_CONTINUE	        (KEY_VALUE_1 | KEY_VALUE_3 | KEY_CONTINUE)

#define BUTTON_DOWN_MODE_PRESS		    (KEY_VALUE_2 | KEY_VALUE_3 | KEY_PRESS)
#define BUTTON_DOWN_MODE_RELEASE	    (KEY_VALUE_2 | KEY_VALUE_3 | KEY_RELEASE)
#define BUTTON_DOWN_MODE_LONG		    (KEY_VALUE_2 | KEY_VALUE_3 | KEY_LONG)
#define BUTTON_DOWN_MODE_CONTINUE	    (KEY_VALUE_2 | KEY_VALUE_3 | KEY_CONTINUE)

#define BUTTON_UP_MODE_PRESS	        (KEY_VALUE_1 | KEY_VALUE_2 | KEY_PRESS)
#define BUTTON_UP_MODE_RELEASE	        (KEY_VALUE_1 | KEY_VALUE_2 | KEY_RELEASE)
#define BUTTON_UP_MODE_LONG		        (KEY_VALUE_1 | KEY_VALUE_2 | KEY_LONG)
#define BUTTON_UP_MODE_CONTINUE	        (KEY_VALUE_1 | KEY_VALUE_2 | KEY_CONTINUE)

#define BUTTON_UP_LAMP_PRESS	        (KEY_VALUE_1 | KEY_VALUE_5 | KEY_PRESS)
#define BUTTON_UP_LAMP_RELEASE	        (KEY_VALUE_1 | KEY_VALUE_5 | KEY_RELEASE)
#define BUTTON_UP_LAMP_LONG		        (KEY_VALUE_1 | KEY_VALUE_5 | KEY_LONG)
#define BUTTON_UP_LAMP_CONTINUE	        (KEY_VALUE_1 | KEY_VALUE_5 | KEY_CONTINUE)

#define BUTTON_DOWN_POWER_PRESS		    (KEY_VALUE_4 | KEY_VALUE_3 | KEY_PRESS)
#define BUTTON_DOWN_POWER_RELEASE	    (KEY_VALUE_4 | KEY_VALUE_3 | KEY_RELEASE)
#define BUTTON_DOWN_POWER_LONG		    (KEY_VALUE_4 | KEY_VALUE_3 | KEY_LONG)
#define BUTTON_DOWN_POWER_CONTINUE	    (KEY_VALUE_4 | KEY_VALUE_3 | KEY_CONTINUE)

/******************************************************************************
 * 类型定义 ('typedef')                                         
 ******************************************************************************/
 
/******************************************************************************
 * 全局变量声明 
 ******************************************************************************/
#define KEY_FIFO_LENGTH         8       /*按键FIFO长度*/
#define KEY_FIFO_ID             0x02    /*按键FIFO队列ID*/


extern uint8_t gucKey_Stucked;
/******************************************************************************
 * 函数声明 
 ******************************************************************************/

void vBsp_Key_Init(void);
uint8_t ucKey_Scan(void);				/*扫描按键状态，需定时调用*/




#endif
